package com.cty.Recursion;

/*
*
* 八皇后问题的解法
*
*
* */
public class queen8 {
    int max = 8;//表示最多几个皇后
    //创建一个一维数组其下标代表皇后所在的行，元素值代表所在的列
    int [] array = new int[max];
    //创建一个静态的count变量用于统计8皇后的解法
    static int count = 0;

    public static void main(String[] args) {
        queen8 queen8 = new queen8();
        queen8.check(0);
        System.out.println("总共符合游戏规则的结果：" + count);
    }
    //创建一个check用来检测是否符合游戏规则
    private void check(int n) {
        for (int i = 0;i < max;i++) {
            if (n == max) {
                print();
                return;
            }
            array[n] = i;
            if (judge(n)) {
                check(n+1);
            }
        }

    }

    //创建一个判断方法用于判断皇后放在这个位置是否合理(n表示第几个皇后)
    private boolean judge(int n) {
        for (int i = 0;i < n;i++) {
            if (array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i])) {
                return false;
            }
        }
        return true;
    }

    //创建一个打印出所有解法的方法(因为array是数组引用变量在递归中受递归所影响)
    private void print() {
        count++;
        for (int i = 0;i < array.length;i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}
